#ifndef SHADER_MANAGER_H
#define SHADER_MANAGER_H

#include <string>
#include <gl/gl.h>
#include "shaderProgram.h"
#include "resourceManager.h"
#include "singleton.h"

//! Klasa enkapsulujaca manager shaderow
/*!
	Manager shaderow enkapsuluje jedynie mechanizm tworzenia shaderow, oraz funckje glUseProgram. 
*/
class ShaderManager : public ResourceManager< ShaderProgram >
{
 typedef unsigned int uint;
 friend class Singleton< ShaderManager >;

 private:

	string lastError;

	char* TextFileRead( const char* path );
	bool CompileShader( const uint& shader, const char* path );
	bool LinkProgram( const uint& program );
	bool ValidateProgram( const uint& program );

	ShaderManager() : lastError("") {}
	ShaderManager(const ShaderManager&) { }
	ShaderManager& operator = (const ShaderManager&) { }

	~ShaderManager()
	{ DeleteAll(); }

	void GetByPath()
	{}

 public:

	//! Udostepnia tresc ostatniego bledu.
	string& GetLastError()
	{ return lastError; }

	//Tworzy nowy shader program.
	/*!
		\param fragmentPaths tablica scierzek do plikow z fragment shaderami
		\param fragmentAmount ilosc plikow z fragment shaderami
		\param vertexPaths tablica scierzek do plikow z vertex shaderami
		\param vertexAmount ilosc plikow z vertex shaderami
		\param progName unikatowa nazwa programu
		\return true jesli udalo sie utworzyc program, false wpp. W razie porazki, mozna posluzyc sie GetLastError aby uzyskac dodatkowe inf.
	*/
	bool CreateShaderProgram( const char* fragmentPaths[], const int& fragmentAmount,
		                      const char* vertexPaths[], const int& vertexAmount,
							  const char* progName );

	//! Uzycie utworzonego wczesniej shader programu
	/*
		Ta funkcja enkapsuluje glUseProgram.
		\param progName nazwa utworzonego wczesniej shader programu. Jesli w parametrze przeslemy NULL, rezygnujemy z shader programow i wracamy do fixed pipline.
		\return true jesli sukces, false wpp. W razie porazki, mozna posluzyc sie GetLastError.
	*/
	bool UseProgram( const char* progName );

	//! Usuwa wszystkie shader programy z managera.
	void DeleteAll();

	//! Usuwa wskazany shader program z managera
	const bool DeleteResource( const char* key );
};
#define ShaderManagerAPI Singleton< ShaderManager >::Instance()


#endif